package utils

import (
	"bufio"
	"fmt"
	"os"
	"strings"
	"unicode"
)

const (
	untrust_sep = "|#profi#|"
)

var configMap = make(map[string]string)

// 初始化配置映射
func InitConfig() error {
	file, err := os.Open("../src/db/db.conf") // 注意是相对于db目录的路径
	if err != nil {
		return fmt.Errorf("打开配置文件失败: %w", err)
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	lineNum := 0

	for scanner.Scan() {
		lineNum++
		line := strings.TrimSpace(scanner.Text())

		// 跳过空行和注释行
		if line == "" || strings.HasPrefix(line, "#") {
			continue
		}

		// 跳过组标记行
		if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") {
			continue
		}

		// 解析键值对
		parts := strings.SplitN(line, "=", 2)
		if len(parts) != 2 {
			return fmt.Errorf("第 %d 行格式错误: 缺少等号", lineNum)
		}

		key := strings.TrimSpace(parts[0])
		value := strings.TrimSpace(parts[1])

		// 移除值末尾的注释
		if commentIndex := strings.Index(value, "#"); commentIndex != -1 {
			value = strings.TrimSpace(value[:commentIndex])
		}

		// 验证键长度
		if len(key) > 40 {
			return fmt.Errorf("第 %d 行键过长(>40字符): %s", lineNum, key)
		}

		// 验证值长度
		if len(value) > 400 {
			return fmt.Errorf("第 %d 行值过长(>400字符): %s", lineNum, value)
		}

		// 存储到配置映射
		configMap[key] = value
	}
	if err := scanner.Err(); err != nil {
		return fmt.Errorf("读取配置文件失败: %w", err)
	}
	return nil
}

// 获取字符串配置值
func GetString(key string) string {
	if value, ok := configMap[key]; ok {
		return value
	}
	return ""
}

// 获取整型配置值
func GetInt(key string) int {
	value := GetString(key)

	// 验证是否为纯数字
	for _, ch := range value {
		if !unicode.IsDigit(ch) {
			return 0
		}
	}

	// 转换为整数
	var result int
	_, err := fmt.Sscanf(value, "%d", &result)
	if err != nil {
		return 0
	}
	return result
}

func EncodeLuaTableString(strs []string) string {
	return strings.Join(strs, untrust_sep)
}
